﻿using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.UI;
using Entidades.Seguridad;
using Modelo.Seguridad;
using MvcPaging;

namespace VistaOnlineR1._1.Controllers.Seguridad
{
    public class PermisosController : BaseController
    {
         #region campos
        CatalogoPermisos _catalogoPermiso;
        #endregion

        #region Constructors
        public PermisosController()
            : this(new CatalogoPermisos())
        {
        }

        public PermisosController(CatalogoPermisos catalogoPermiso)
        {
            _catalogoPermiso = catalogoPermiso;
        }
        #endregion

        private const int DefaultPageSize = 10;


        public ViewResultBase Search(string text, int? page)
        {

            List<Perfil> listPerfil = RecuperarPerfil();

            ViewBag.PermisoDelete = listPerfil.Any(per => per.Permiso.Nombre == "Delete");
            ViewBag.PermisoCrear = listPerfil.Any(per => per.Permiso.Nombre == "Create");
            ViewBag.PermisoEditar = listPerfil.Any(per => per.Permiso.Nombre == "Edit");

            List<Permiso> permisos = _catalogoPermiso.ListarPermisos(text).ToList();
        
            int currentPageIndex = page.HasValue ? page.Value - 1 : 0;
            
            
            if (Request.IsAjaxRequest())
                return PartialView("Index", permisos.OrderBy(c => c.Nombre).ToList().ToPagedList(currentPageIndex, DefaultPageSize));
            else
                return View("Index", permisos.OrderBy(c => c.Nombre).ToList().ToPagedList(currentPageIndex, DefaultPageSize));
        }


        [Authorize(Roles = "Administracion")]
        public ActionResult Index(int? page)
        {
            List<Perfil> listPerfil = RecuperarPerfil();

            ViewBag.PermisoDelete = listPerfil.Any(per => per.Permiso.Nombre == "Delete");
            ViewBag.PermisoCrear = listPerfil.Any(per => per.Permiso.Nombre == "Create");
            ViewBag.PermisoEditar = listPerfil.Any(per => per.Permiso.Nombre == "Edit");

            List<Permiso> permisos = _catalogoPermiso.ListarPermisos().ToList();

            int currentPageIndex = page.HasValue ? page.Value - 1 : 0;

            return View(permisos.OrderBy(c => c.Nombre).ToList().ToPagedList(currentPageIndex, DefaultPageSize));
        }

        [Authorize(Roles = "Administracion")]
        public ActionResult Details(int id)
        {
            return View();
        }

        //
        // GET: /Permisos/Create
        [Authorize(Roles = "Administracion")]
        public ActionResult Create()
        {

            Int32 max = _catalogoPermiso.GetMayor() + 1;


            Permiso permiso = new Permiso();
            permiso.IdPermiso = max.ToString();

            return View(permiso);
        } 

        //
        // POST: /Permisos/Create

        [HttpPost]
        [Authorize(Roles = "Administracion")]
        public ActionResult Create(Permiso oPermiso)
        {
            try
            {

                if (_catalogoPermiso.AgregarPermiso(oPermiso))
                {return RedirectToAction("Index");}

                ModelState.AddModelError("", "El Permiso ingresado ya pertenece al sistema.");
                return View(oPermiso);

            }
            catch
            {
                return View();
            }
        }
        
        //
        // GET: /Permisos/Edit/5
        [Authorize(Roles = "Administracion")]
        public ActionResult Edit(string IdPermiso)
        {
            Permiso oPermiso = _catalogoPermiso.BuscarPermiso(IdPermiso);
            return View(oPermiso);
        }

        //
        // POST: /Permisos/Edit/5

        [HttpPost]
        [Authorize(Roles = "Administracion")]
        public ActionResult Edit(Permiso oPermiso)
        {
            try
            {
                _catalogoPermiso.ModificarPermiso(oPermiso);
                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }

        //
        // GET: /Permisos/Delete/5
        [Authorize(Roles = "Administracion")]
        public ActionResult Delete(string IdPermiso)
        {

            Permiso oPermiso = _catalogoPermiso.BuscarPermiso(IdPermiso);
            return View(oPermiso);
        }

        //
        // POST: /Permisos/Delete/5

        [HttpPost]
        [Authorize(Roles = "Administracion")]
        public ActionResult Delete(Permiso oPermiso)
        {
            try
            {
                if (_catalogoPermiso.EliminarPermiso(oPermiso))

                {
                    return RedirectToAction("Index");
                }

                ModelState.AddModelError("", "El Permiso que desea eliminar se encuentra asignado a un formulario y/o perfil.");
                return View(oPermiso);

            }
            catch
            {
                return View();
            }
        }
    }
}
